#include <unistd.h>
#include <cstdlib>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>


void CreatDaemon(){
    // 设置文件掩码为0，避免后续文件创建权限不符合预期
    umask(0);
    // 忽略异常信号
    signal(SIGCHLD,SIG_IGN);
    signal(SIGPIPE,SIG_IGN);
    
    pid_t chid=fork();
    if(chid < 0){
        exit(-1);
    }
    // 此处因为守护进程不能是进程组组长，所以关闭父进程，保留子进程进行后续操作
    if(chid>0){
        exit(1);
    }
    // 将该子进程设置为会话进程，与当前bash脱离
    pid_t cchid=setsid();
    if(cchid<0){
        exit(2);
    }
    // 此处守护进程一般不允许和用户直接交互，因此没有必要打开终端，而对于该进程设置为会话进程之后默认是首进程，有打开终端的可能，因此可以再fork一个子进程，子进程没有打开终端的能力
    pid_t daemon=fork();
    if(daemon<0){
        exit(3);
    }
    if(daemon>0){
        exit(4);
    }
    // 改变工作目录为根目录，让守护进程以绝对路径访问资源
    chdir("/");
    // 关闭守护进程的0，1，2，将其重定向到/dev/null中
    int fd=open("dev/null",O_RDWR);
    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);
    close(fd);
}

int main(){
    CreatDaemon();
    while(1){
        
    }
    return 0;
}